/***********************************************************************************
 * 文件名： mcu.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		MCU 所有的驱动顶层文件，使用MCU驱动只用包含这一个文件即可。
 * 修改记录：
 * 	2023/4/19: 初版。 刘言。
***********************************************************************************/
#ifndef _MCU_H_
#define _MCU_H_

#ifdef __cplusplus
 extern "C" {
#endif

// MCU型号系列定义

#ifndef N32G455
    #define N32G455    0
#endif

#include "N32_Config.h"
#include "..\ARM\polsys_armlib.h"



// /* -------  Start of section using anonymous unions and disabling warnings  ------- */
// #if   defined (__CC_ARM)
//   #pragma push
//   #pragma anon_unions
// #elif defined (__ICCARM__)
//   #pragma language=extended
// #elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
//   #pragma clang diagnostic push
//   #pragma clang diagnostic ignored "-Wc11-extensions"
//   #pragma clang diagnostic ignored "-Wreserved-id-macro"
// #elif defined (__GNUC__)
//   /* anonymous unions are enabled by default */
// #elif defined (__TMS470__)
//   /* anonymous unions are enabled by default */
// #elif defined (__TASKING__)
//   #pragma warning 586
// #elif defined (__CSMC__)
//   /* anonymous unions are enabled by default */
// #else
//   #warning Not supported compiler type
// #endif


// 依据型号包含头文件

#ifndef N32_MCU_SERIES
    #error "未定义 N32_MCU_SERIES"
#else
    #if (N32_MCU_SERIES == N32G455)
        #include "n32g45x.h"
    #endif
#endif

///////////////////////////// 参数计算

#define F_SYSCLK (F_HCLK_MHZ * 1000000)
#define F_HCLK  F_SYSCLK                // CPU频率

/* PCLK2 max 72M */
#if (F_SYSCLK > 72000000)
    #define F_PCLK2 (F_SYSCLK/2)
    #define F_TIM1_8 (F_PCLK2*2)
#else
    #define F_PCLK2 F_SYSCLK
    #define F_TIM1_8 F_PCLK2
#endif
/* PCLK1 max 36M */
#if (F_SYSCLK > 72000000)
    #define F_PCLK1 (F_SYSCLK/4)
    #define F_TIM2TO7 (F_PCLK1 * 2)
#elif (F_SYSCLK > 36000000)
    #define F_PCLK1 (F_SYSCLK / 2)
    #define F_TIM2TO7 (F_PCLK1 * 2)
#else
    #define F_PCLK1 F_SYSCLK
    #define F_TIM2TO7 F_PCLK1
#endif

///////////////////////////// 提供的API

#define Mcu_GetUcid()			(u8 *)UCID_BASE
#define Mcu_GetUcidLength()		UCID_LENGTH
#define Mcu_GetUid()			(u8 *)UID_BASE
#define Mcu_GetUidLength()		UID_LENGTH

void Nvic_Enable(IRQn_Type irqn);


// 提供给 Polsys 调用
#define Mcu_Init()      
#define Mcu_TickStart() SysTick_Config(SYSTICK_VALUE) // 启动系统节拍计时器

///////////////////////////// 外设驱动

#include "mcu_power.h"
#include "mcu_delay.h"
#include "mcu_flash.h"
#include "mcu_uart.h"
#include "mcu_gpio.h"
#include "mcu_can.h"


#ifdef N32_USE_RTT_DRV
#ifndef N32_MCU_SERIES
    #error "未定义 N32_MCU_SERIES"
#else
    #if (N32_MCU_SERIES == N32G455)
        #include "G45x/rtthread_driver/drv_adc.h"
		#include "G45x/rtthread_driver/drv_can.h"
		#include "G45x/rtthread_driver/drv_dac.h"
		#include "G45x/rtthread_driver/drv_gpio.h"
		#include "G45x/rtthread_driver/drv_hwtimer.h"
		#include "G45x/rtthread_driver/drv_i2c.h"
		#include "G45x/rtthread_driver/drv_spi.h"
		#include "G45x/rtthread_driver/drv_usart.h"
		#include "G45x/rtthread_driver/drv_wdt.h"
    #endif
#endif
#endif

#ifdef __cplusplus
}
#endif

#endif

